package com.dymall.cart.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dymall.cart.domain.dto.CartDTO;
import com.dymall.cart.domain.dto.CartItemDTO;
import com.dymall.cart.domain.pojo.Cart;
import com.dymall.cart.domain.pojo.CartItem;
import com.dymall.cart.mapper.CartMapper;
import com.dymall.cart.mapper.CartItemMapper;
import com.dymall.cart.service.ICartService;
import com.dymall.common.api.ProductClient;
import com.dymall.common.exception.DbException;
import com.dymall.common.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@Transactional
public class CartServiceImpl extends ServiceImpl<CartMapper,Cart> implements ICartService {

    @Autowired
    private CartMapper cartMapper;

    @Autowired
    private CartItemMapper cartItemMapper;

    @Autowired
    private ProductClient productClient;

    // 从UserContext获取用户id
    public Long getUserId(){
        return UserContext.getUser();
    }

    // 为新用户创建一个购物车
    // 插入一条购物车信息，返回购物车id
    @Override
    public Cart createCart(Long userId){
        // 判断用户是否存在购物车
        Cart existCart = cartMapper.selectByUserId(userId);
        if(existCart != null){
            // 存在购物车直接返回
            return existCart;
        }

        // 创建新购物车
        // 返回id
        Cart newCart = new Cart();
        newCart.setUserId(userId);
        boolean saved = cartMapper.insert(newCart) > 0;
        if(!saved){
            throw new DbException("创建购物车失败！数据库内部异常");
        }
        return newCart;
    }


    // 新增一个商品到购物车
    // 先根据用户id获取购物车id
    // 向cartItem插入一条数据
    @Override
    public void addItem(Long userId, CartItemDTO cartItemDTO) {
        // 获取当前用户购物车
        Cart cart = createCart(userId);

        Long cartId = cart.getId();
        Long productId = cartItemDTO.getProductId();
        Integer quantity = cartItemDTO.getQuantity();

        // 判断购物车里是否有该商品
        CartItem existItem = cartItemMapper.findItem(cartId, productId);
        if(existItem != null){
            // 有该商品，数量增加
            cartItemMapper.incQuantity(cartId, productId,existItem.getQuantity()+quantity);
            return;
        }

        // 添加到购物车
        CartItem item = new CartItem();
        item.setCartId(cartId);
        item.setProductId(productId);
        item.setQuantity(quantity);
        cartItemMapper.insertItem(item);
    }

    // 根据用户id获取购物车信息
    @Override
    public CartDTO getCart(Long userId) {
        // 查询 Cart 表，根据 userId 获取 cart 信息
        Cart cart = createCart(userId);

        // 查询 CartItem 表，获取 cart 对应的所有商品项
        List<CartItem> cartItems = cartItemMapper.selectByCartId(cart.getId());

        // 将 cart 和 items 转换为 CartDTO 对象
        CartDTO cartDTO = new CartDTO();
        cartDTO.setUserId(cart.getUserId());

        List<CartItemDTO> itemDTOList = new ArrayList<>();
        for(CartItem item:cartItems){
            // 购物车项集合
            CartItemDTO cartItemDTO = new CartItemDTO(item.getProductId(), item.getQuantity());
            itemDTOList.add(cartItemDTO);
        }
        cartDTO.setItems(itemDTOList);

        return cartDTO;
    }


    // 清空购物车
    @Override
    public void emptyCart(Long userId) {
        Cart cart = cartMapper.selectByUserId(userId);
        System.out.println("删除购物车："+cart);
        // 如果存在该购物车，清空购物车
        if(cart != null){
            cartItemMapper.clearCart(cart.getId());
        }
    }


    // 删除一个商品
    @Override
    public void removeAItem(Long productId) {
        Cart cart = cartMapper.selectByUserId(getUserId());
        Long i = cartItemMapper.deleteItemById(cart.getId(), productId);
        System.out.println(i);
    }



    // 批量删除
    @Override
    public void removeItems(List<Long> productIds) {
        // 1. 获取用户的购物车 ID
        Cart cart = cartMapper.selectByUserId(getUserId());
        Long cartId = cart.getId();
        cartItemMapper.deleteItems(cartId, productIds);
    }


}
